var express = require("express")
var router = express.Router()
var User = require("../models/user")
var crypto = require("crypto")
var Movie = require("../models/movie")
var Mail = require("../models/mail")
var Comment = require("../models/comment")
const salt = "TKL02O"

/**
 * status：（此次请求的错误情况， l 为出错， 0 为正常）
 * message：（错误或者是成功提示）
 * data：（需要传送的数据〕
 */

// userSave:
// [ { _id: 5ed0accb9b1e294b004e6b87,
//   username: 'aaa',
//   password: 'bbb',
//   userMail: 'ccc',
//   userPhone: '158',
//   userAdmin: '0',
//   userPower: 0,
//   userStop: false,
//   __v: 0 } ]

/* GET users listing. */
router.get("/", function (req, res, next) {
	res.send("respond with a resource")
})

/*
 * 用户登录接口
 */
router.post("/login", function (req, res, next) {
	const {
		body: { username, password },
	} = req
	if (!username) {
		res.json({ status: 500, message: "用户名为空" })
	}
	if (!password) {
		res.json({ status: 500, message: "密码为空" })
	}
	// 查找用户名、密码相同且不处于封停状态的账号信息
	User.findUserLogin(username, password, function (err, userSave) {
		if (userSave) {
			// 使用MD5加密id生成token值，返回给客户端
			var token_after = getMD5Password(userSave._id)
			res.json({
				status: 200,
				data: { token: token_after, user: userSave },
				message: "用户登录成功",
			})
		} else {
			res.json({ status: 500, message: "用户名或者密码错误" })
		}
	})
})

/*
 * 用户注册
 */
router.post("/register", function (req, res, next) {
	const {
		body: { username, password, userMail, userPhone },
	} = req
	if (!username) {
		res.json({ status: 500, message: "用户名为空" })
	}
	if (!password) {
		res.json({ status: 500, message: "密码为空" })
	}
	if (!userMail) {
		res.json({ status: 500, message: "用户邮箱为空" })
	}
	if (!userPhone) {
		res.json({ status: 500, message: "用户手机为空" })
	}
	// 查找用户名重复的账号信息
	User.findByUsername(username, function (err, userSave) {
		if (userSave) {
			res.json({ status: 500, message: "用户已注册" })
		} else {
			var registerUser = new User({
				username,
				password,
				userMail,
				userPhone,
				userAdmin: 0,
				userPower: 0,
				userStop: 0,
			})
			// 保存用户到数据库save
			registerUser.save(function () {
				res.json({ status: 200, message: "注册成功" })
			})
		}
	})
})

/*
 * 用户提交评论
 */
router.post("/postComment", function (req, res, next) {
	const {
		body: { movieId, username, context },
	} = req
	let userName
	// 验证完整性
	if (!username) {
		userName = "匿名用户"
	} else {
		userName = username
	}
	if (!movieId) {
		res.json({ status: 500, message: "电影id为空" })
	}
	if (!context) {
		res.json({ status: 500, message: "评论内容为空" })
	}
	// 根据数据集建立一个新的数据内容
	var saveComment = new Comment({
		movie_id: movieId,
		username: userName,
		context,
		check: 0,
	})
	// 保存合适的数据集
	saveComment.save(function (err) {
		if (err) {
			res.json({ status: 500, message: err })
		} else {
			res.json({ status: 200, message: "评论成功" })
		}
	})
})

/*
 * 用户点赞
 */
router.post("/support", function (req, res, next) {
	const {
		body: { movieId, supportNum },
	} = req
	if (!movieId) {
		res.json({ status: 500, message: "电影id为空" })
	}
	Movie.findById(movieId, function (err, supportMovie) {
		Movie.updateOne({ _id: movieId }, { movieNumSupport: supportNum }, function (err) {
			if (err) {
				res.json({ status: 500, message: "点赞失败", data: err })
			} else {
				res.json({
					status: 200,
					message: "点赞成功",
					data: { movieNumSupport: supportNum },
				})
			}
		})
	})
})

/*
 * 用户下载
 */
router.post("/download", function (req, res, next) {
	const {
		body: { movieId, downloadNum },
	} = req
	if (!movieId) {
		res.json({ status: 500, message: "电影id为空" })
	}
	Movie.findById(movieId, function (err, supportMovie) {
		// find后返回的是[]类型，所以要加[0]
		Movie.updateOne({ _id: movieId }, { movieNumDownload: downloadNum }, function (err) {
			if (err) {
				res.json({ status: 500, message: "下载失败", data: err })
			} else {
				res.json({
					status: 200,
					message: "下载成功",
					data: { movieDownload: supportMovie.movieDownload },
				})
			}
		})
	})
})

/*
 * 用户找回密码、修改密码
 */
router.post("/findPassword", function (req, res, next) {
	const {
		headers,
		query,
		body: { user_id, token, username, password, userMail, userPhone, rePassword },
	} = req
	// token应当从Header['Authorization']里面获取，此处为了简介放在请求参数里面

	console.log("headers", headers)
	console.log("token", headers.authorization)

	// 存在密码
	if (password) {
		// 存在token时，验证状态
		if (token) {
			if (!user_id) {
				res.json({ status: 500, message: "用户登录错误" })
			}
			if (!password) {
				res.json({ status: 500, message: "用户老密码错误" })
			}
			if (token === getMD5Password(user_id)) {
				User.findOne({ _id: user_id, password }, function (err, checkUser) {
					if (checkUser) {
						if (!rePassword) {
							res.json({ status: 500, message: "请设置新密码" })
						}
						User.updateOne({ _id: user_id }, { password: rePassword }, function (err, userUpdate) {
							console.log(userUpdate)
							// { n: 1, nModified: 1, ok: 1 } 成功更新
							if (err) {
								res.json({ status: 500, message: "有token，更改错误", data: err })
							}
							res.json({ status: 200, message: "有token，更改成功", data: userUpdate })
						})
					} else {
						res.json({ status: 500, message: "有token，用户老密码错误" })
					}
				})
			} else {
				res.json({ status: 500, message: "有token，用户登录错误" })
			}
		} else {
			// 不存在token时，直接验证mail和phone
			User.findUserPassword(username, userMail, userPhone, function (err, userFound) {
				if (userFound) {
					if (!rePassword) {
						res.json({ status: 500, message: "请设置新密码" })
					} else {
						User.updateOne({ _id: userFound._id }, { password: rePassword }, function (
							err,
							userUpdate
						) {
							if (err) {
								res.json({ status: 500, message: "无token，更改错误", data: err })
							}
							res.json({ status: 200, message: "无token，更改成功", data: userUpdate })
						})
					}
				} else {
					res.json({ status: 500, message: "无token，信息错误" })
				}
			})
		}
		// 不存在密码的情况
	} else {
		if (!username) {
			res.json({ status: 500, message: "用户名称为空" })
		}
		if (!userMail) {
			res.json({ status: 500, message: "用户邮箱为空" })
		}
		if (!userPhone) {
			res.json({ status: 500, message: "用户手机为空" })
		}
		if (rePassword) {
			User.findUserPassword(username, userMail, userPhone, function (err, userFound) {
				if (userFound) {
					User.updateOne({ _id: userFound._id }, { password: rePassword }, function (
						err,
						userUpdate
					) {
						if (err) {
							res.json({ status: 500, message: "修改密码失败", data: err })
						} else {
							res.json({ status: 200, message: "修改密码成功", data: userUpdate })
						}
					})
				} else {
					res.json({ status: 500, message: "未找到用户" })
				}
			})
		} else {
			User.findUserPassword(username, userMail, userPhone, function (err, userFound) {
				if (userFound) {
					res.json({
						status: 200,
						message: "验证成功，请修改密码",
						data: {
							username,
							userMail,
							userPhone,
						},
					})
				} else {
					res.json({ status: 500, message: "未找到用户" })
				}
			})
		}
	}
})

/**
 * 用户发送站内信
 */
router.post("/sendEmail", function (req, res, next) {
	const {
		body: { token, user_id, username, toUsername, title, context },
	} = req
	if (!token) {
		res.json({ status: 500, message: "用户登陆状态错误" })
	}
	if (!user_id) {
		res.json({ status: 500, message: "用户登陆状态出错" })
	}
	if (!username) {
		res.json({ status: 500, message: "用户名称不正确" })
	}
	if (!toUsername) {
		res.json({ status: 500, message: "未选择相关的用户" })
	}
	if (!title) {
		res.json({ status: 500, message: "标题不能为空" })
	}
	if (!context) {
		res.json({ status: 500, message: "内容不能为空" })
	}
	if (token === getMD5Password(user_id)) {
		User.findByUsername(toUsername, function (err, toUser) {
			if (toUser) {
				var newEmail = new Mail({
					fromUser: username,
					toUser: toUsername,
					title,
					context,
				})
				newEmail.save(function () {
					res.json({ status: 200, message: "发送成功" })
				})
			} else {
				res.json({ status: 500, message: "您发送的对象不存在" })
			}
		})
	} else {
		res.json({ status: 500, message: "用户登录错误" })
	}
})

/**
 * 用户显示站内信，其中的receive参数值为1是发送内容，值为2是收到内容
 *
 */
router.post("/showEmail", function (req, res, next) {
	const {
		body: { token, user_id, username, receive },
	} = req
	if (!token) {
		res.json({ status: 500, message: "用户登录状态错误" })
	}
	if (!user_id) {
		res.json({ status: 500, message: "用户登录状态出错" })
	}
	if (!username) {
		res.json({ status: 500, message: "用户登录状态出错" })
	}
	if (!receive) {
		res.json({ status: 500, message: "参数出错" })
	}
	if (token === getMD5Password(user_id)) {
		console.log("token", token)

		if (receive === "1") {
			// 用户发送的站内信
			Mail.findByFromUsername(username, function (err, sendMail) {
				if (err) {
					res.json({ status: 500, message: "发送的站内信获取失败", data: sendMail })
				}
				if (sendMail.length != 0) {
					res.json({ status: 200, message: "发送的站内信获取成功", data: sendMail })
				} else {
					res.json({ status: 200, message: "发送的站内信件数为0", data: sendMail })
				}
			})
		} else if (receive === "2") {
			// 用户接受的站内信
			Mail.findByToUsername(username, function (err, receiveMail) {
				if (err) {
					res.json({ status: 500, message: "接收的站内信获取失败", data: receiveMail })
				}
				if (receiveMail.length != 0) {
					res.json({ status: 200, message: "接收的站内信获取成功", data: receiveMail })
				} else {
					res.json({ status: 200, message: "接收的站内信件数为0", data: receiveMail })
				}
			})
		}
	} else {
		res.json({ status: 500, message: "用户登录错误" })
	}
})

/**
 * MD5加密
 */
function getMD5Password(id) {
	// 创建MD5
	var md5 = crypto.createHash("md5")
	// 创建需要加密的字符串：id+盐
	var token_before = id + salt
	// 返回加密后的token
	return md5.update(token_before).digest("hex")
}

module.exports = router
